class Solution {
    public int[] singleNumbers(int[] nums) {
        int ret = 0;
        for(int n : nums) {
            ret ^= n;
        }

        // 循环左移，计算num
        //若整数 x⊕yx \oplus yx⊕y 某二进制位为 111 ，则 xxx 和 yyy 的此二进制位一定不同
        int num = 1;
        while((num & ret) == 0) {
            num <<= 1;
        }

        //拆分
        int x = 0;
        int y = 0;
        for(int n : nums) {
            if ((n & num) != 0) {
                x ^= n;
            } else {
                y ^= n;
            }
        }
        return new int[]{x,y};
    }
}